﻿using iTextSharp.text;
using iTextSharp.text.pdf;

using System;
using System.Collections.Generic;

using System.IO;
using System.Linq;
using System.Text;
using System.Xml.Linq;


namespace YTCMS.Core.PDF
{
    public class PDFHelper
    {
        //const string Default_Font = "simsun";
        //static Font CreateFont(XElement xmlNd, PDFdata data)
        //{
        //    string fontName = XmlHelper.GetAttribeVal(xmlNd, "font", Default_Font);
        //    if (string.IsNullOrWhiteSpace(fontName))
        //        fontName = Default_Font;
        //    string fontPath = data.fontPath[fontName];
        //    int fontsize = TypeHelper.StrToInt(XmlHelper.GetAttribeVal(xmlNd, "fontsize"), 12);
        //    BaseFont bf = BaseFont.CreateFont(fontPath, BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
        //    @"C:/Windows/Fonts/simsun.ttc,1"
        //    BaseFont bf = BaseFont.CreateFont("STSong-Light", "UniGB-UCS2-H", BaseFont.EMBEDDED);//BaseFont.NOT_EMBEDDED 
        //    int fontStyle = TypeHelper.StrToInt(XmlHelper.GetAttribeVal(xmlNd, "fontstyle"), 0);
        //    /*
        //      public const int BOLD = 1;
        //public const int BOLDITALIC = 3;
        //public const int DEFAULTSIZE = 12;
        //public const int ITALIC = 2;
        //public const int NORMAL = 0;
        //public const int STRIKETHRU = 8;
        //public const int UNDEFINED = -1;
        //public const int UNDERLINE = 4;
        //     */
        //    var FontChinese = new iTextSharp.text.Font(bf, fontsize, iTextSharp.text.Font.NORMAL);
        //    return FontChinese;
        //}
        //static string CreateTextByPms(string content, XElement xmlNd, Dictionary<string, string> pms)
        //{
        //    if (string.IsNullOrWhiteSpace(content) || xmlNd == null || xmlNd.Element("pms") == null || xmlNd.Element("pms").Elements("pm") == null)
        //        return string.IsNullOrWhiteSpace(content) ? "" : content.Replace("@<br>@", Environment.NewLine);
        //    var pmsXml = xmlNd.Element("pms").Elements("pm");
        //    foreach (var pmXml in pmsXml)
        //    {
        //        var pmName = XmlHelper.GetAttribeVal(pmXml, "name");
        //        if (string.IsNullOrWhiteSpace(pmName))
        //            continue;
        //        content = content.Replace(pmName, pms == null || !pms.ContainsKey(pmName) ? "" : pms[pmName]);
        //    }
        //    return string.IsNullOrWhiteSpace(content) ? "" : content.Replace("@<br>@", Environment.NewLine);
        //}

        //static IElement CreateContent(PdfWriter writer, Document doc, XElement xmlNd, PDFdata data)
        //{
        //    Dictionary<string, string> pms = data == null ? null : data.pms;
        //    Dictionary<string, List<string>> tbData = data == null ? null : data.tbData;
        //    if (doc == null || xmlNd == null)
        //        return null;
        //    var font = CreateFont(xmlNd, data);
        //    var fType = XmlHelper.GetAttribeVal(xmlNd, "type");
        //    if (string.IsNullOrWhiteSpace(fType))
        //        return null;
        //    fType = fType.ToLower();
        //    if (fType == "text")
        //    {
        //        var txt = xmlNd.Value;
        //        var phrase = new Paragraph(CreateTextByPms(txt, xmlNd, pms), font);
        //        0=Left, 1=Centre, 2=Right 
        //        Element.ALIGN_CENTER
        //        phrase.Alignment = TypeHelper.StrToInt(XmlHelper.GetAttribeVal(xmlNd, "alignment"), 0);
        //        if (TypeHelper.StrToInt(XmlHelper.GetAttribeVal(xmlNd, "after"), 0) > 0)
        //            phrase.SpacingAfter = TypeHelper.StrToInt(XmlHelper.GetAttribeVal(xmlNd, "after"), 5);
        //        else
        //            phrase.SpacingAfter = 5;
        //        if (TypeHelper.StrToInt(XmlHelper.GetAttribeVal(xmlNd, "before"), 0) > 0)
        //            phrase.SpacingBefore = TypeHelper.StrToInt(XmlHelper.GetAttribeVal(xmlNd, "before"), 1);
        //        phrase.MultipliedLeading = 1.2f; //行间距
        //        Paragraph.FirstLineIndent  //allows you to apply a float value to indent the first line
        //        Paragraph.IndentationLeft  //allows you to add space to the left hand side
        //        Paragraph.IndentationRight //allows you to add space to the right hand side
        //        Paragraph.setSpacingBefore //adds a specified amount of space above the paragraph
        //         Paragraph.setSpacingAfter  //adds the specified amount of space after the paragraph
        //        doc.Add(phrase);
        //        return phrase;
        //    }
        //    else if (fType == "table_dynamic")
        //    {
        //        CreateTableDynamic(doc, xmlNd, data);
        //    }
        //    else if (fType == "table_static")
        //    {
        //        CreateTableStatic(doc, xmlNd, data);
        //    }
        //    else if (fType == "newpage")
        //    {
        //        doc.NewPage();
        //    }
        //    else if (fType == "cachet")
        //    {
        //        var cachet_img_path = XmlHelper.GetAttribeVal(xmlNd, "path");
        //        if (string.IsNullOrWhiteSpace(cachet_img_path) || !File.Exists(cachet_img_path))
        //            return null;
        //        var cachet_img_x = TypeHelper.StrToFloat(XmlHelper.GetAttribeVal(xmlNd, "x"), 0f);
        //        var cachet_img_y = TypeHelper.StrToFloat(XmlHelper.GetAttribeVal(xmlNd, "y"), 0f);
        //        var cachet_image2 = iTextSharp.text.Image.GetInstance(cachet_img_path);
        //        cachet_image2.SetAbsolutePosition(cachet_img_x, cachet_img_y);
        //        writer.DirectContent.AddImage(cachet_image2);
        //    }
        //    return null;

        //}

        //static IElement CreateTableDynamic(Document doc, XElement xmlNd, PDFdata data)
        //{
        //    Dictionary<string, string> pms = data == null ? null : data.pms;
        //    Dictionary<string, List<string>> tbData = data == null ? null : data.tbData;
        //    if (doc == null || xmlNd == null || xmlNd.Element("table") == null || xmlNd.Element("table").Element("cells") == null)
        //        return null;
        //    var tableXml = xmlNd.Element("table");
        //    var cellsXml = xmlNd.Element("table").Element("cells").Elements("cell");
        //    if (cellsXml == null || cellsXml.Count() == 0)
        //        return null;
        //    var rowsXmlList = new Dictionary<int, List<PDFtableRow>>();
        //    int maxRowsNum = 0;
        //    var cell_index = 0;
        //    foreach (var cellXml in cellsXml)
        //    {

        //        if (cellXml.Element("rows") == null || cellXml.Element("rows").Elements("row").Count() == 0)
        //        {
        //            rowsXmlList.Add(cell_index, new List<PDFtableRow>());
        //        }
        //        else
        //        {
        //            var MyrowsXmlList = new List<PDFtableRow>();
        //            var rowsXml = cellXml.Element("rows").Elements("row");
        //            获取最大行数
        //            int rowsDataNum = 0;
        //            foreach (var rowXml in rowsXml)
        //            {
        //                var rowKey = XmlHelper.GetAttribeVal(rowXml, "key");
        //                if (string.IsNullOrWhiteSpace(rowKey) || tbData == null || !tbData.ContainsKey(rowKey) || tbData[rowKey] == null || tbData[rowKey].Count == 0)
        //                {
        //                    rowsDataNum++;
        //                    MyrowsXmlList.Add(new PDFtableRow() { key = rowKey, isDynamic = false, text = rowXml.Value, rowXml = rowXml });
        //                }
        //                else
        //                {
        //                    rowsDataNum = rowsDataNum + tbData[rowKey].Count;
        //                    foreach (var tb in tbData[rowKey])
        //                    {
        //                        MyrowsXmlList.Add(new PDFtableRow() { key = rowKey, isDynamic = true, text = tb, rowXml = rowXml });
        //                    }
        //                }
        //            }
        //            rowsXmlList.Add(cell_index, MyrowsXmlList);
        //            if (rowsDataNum > maxRowsNum)
        //                maxRowsNum = rowsDataNum;
        //        }
        //        cell_index++;
        //    }
        //    if (maxRowsNum <= 0)
        //        return null;

        //    PdfPTable table = new PdfPTable(cellsXml.Count());
        //    for (int i = 0; i < maxRowsNum; i++)
        //    {

        //        foreach (var cellData in rowsXmlList)
        //        {
        //            var cellXmlDatas = cellData.Value;
        //            if (cellXmlDatas == null || cellXmlDatas.Count == 0 || cellXmlDatas.Count - 1 < i)
        //            {
        //                table.AddCell(" ");
        //            }
        //            else
        //            {
        //                var rowXmlData = cellXmlDatas[i];
        //                string cellText = "";
        //                if (rowXmlData.isDynamic)
        //                    cellText = rowXmlData.text;
        //                else
        //                    cellText = CreateTextByPms(rowXmlData.text, rowXmlData.rowXml, pms);
        //                PdfPCell cell = new PdfPCell(new iTextSharp.text.Phrase(cellText, CreateFont(rowXmlData.rowXml, data)));
        //                cell.Colspan = 3; //cell.VerticalAlignment
        //                cell.HorizontalAlignment = TypeHelper.StrToInt(XmlHelper.GetAttribeVal(rowXmlData.rowXml, "alignment"), 1); //0=Left, 1=Centre, 2=Right 
        //                table.AddCell(cell);
        //            }
        //        }
        //    }
        //    float WidthPercentage = TypeHelper.StrToFloat(XmlHelper.GetAttribeVal(tableXml, "percent"), 0);
        //    if (WidthPercentage > 0)
        //        table.WidthPercentage = WidthPercentage;//设置表格占的宽度，百分比 
        //    table.TotalWidth = 50f;//设置表格占的宽度，单位点数 
        //    table.SetTotalWidth(new float[]{200f}); 
        //    table.SetWidthPercentage(); 
        //    table.HorizontalAlignment = Element.ALIGN_LEFT; 
        //    Rectangle rect = new Rectangle(523, 770); 
        //    table.SetWidthPercentage(new float[] { 50, 25, 25 }, rect); 
        //    table.DefaultCell.BackgroundColor = (BaseColor.LIGHT_GRAY); //(null)

        //    table.SpacingBefore = 5;
        //    table.SpacingAfter = 5;
        //    doc.Add(table);
        //    return table;
        //}

        //static BaseColor GetPDFColor(string color)
        //{
        //    if (string.IsNullOrWhiteSpace(color))
        //        return BaseColor.BLACK;
        //    color = color.ToUpper();
        //    switch (color)
        //    {
        //        case "BLACK":
        //            return BaseColor.BLACK;
        //        case "BLUE":
        //            return BaseColor.BLUE;
        //        case "CYAN":
        //            return BaseColor.CYAN;
        //        case "DARK_GRAY":
        //            return BaseColor.DARK_GRAY;
        //        case "GRAY":
        //            return BaseColor.GRAY;
        //        case "GREEN":
        //            return BaseColor.GREEN;

        //        case "LIGHT_GRAY":
        //            return BaseColor.LIGHT_GRAY;
        //        case "MAGENTA":
        //            return BaseColor.MAGENTA;
        //        case "ORANGE":
        //            return BaseColor.ORANGE;
        //        case "PINK":
        //            return BaseColor.PINK;
        //        case "RED":
        //            return BaseColor.RED;
        //        case "WHITE":
        //            return BaseColor.WHITE;
        //        case "YELLOW":
        //            return BaseColor.YELLOW;
        //        default:
        //            return BaseColor.BLACK;
        //    }
        //    /*
        //     * public static readonly BaseColor BLACK;
        //public static readonly BaseColor BLUE;
        //public static readonly BaseColor CYAN;
        //public static readonly BaseColor DARK_GRAY;
        //public static readonly BaseColor GRAY;
        //public static readonly BaseColor GREEN;
        //public static readonly BaseColor LIGHT_GRAY;
        //public static readonly BaseColor MAGENTA;
        //public static readonly BaseColor ORANGE;
        //public static readonly BaseColor PINK;
        //public static readonly BaseColor RED;
        //public static readonly BaseColor WHITE;
        //public static readonly BaseColor YELLOW;
        //     */
        //}

        //static IElement CreateTableStatic(Document doc, XElement xmlNd, PDFdata data)
        //{
        //    Dictionary<string, string> pms = data == null ? null : data.pms;
        //    Dictionary<string, List<string>> tbData = data == null ? null : data.tbData;
        //    if (doc == null || xmlNd == null || xmlNd.Element("table") == null || xmlNd.Element("table").Element("rows") == null)
        //        return null;
        //    var tableXml = xmlNd.Element("table");
        //    float WidthPercentage = TypeHelper.StrToFloat(XmlHelper.GetAttribeVal(tableXml, "percent"), 0);
        //    int columns = TypeHelper.StrToInt(XmlHelper.GetAttribeVal(tableXml, "columns"), 0);

        //    string table_type = XmlHelper.GetAttribeVal(tableXml, "type");//type="rows"
        //    var rowsXml = xmlNd.Element("table").Element("rows").Elements("row");
        //    if (rowsXml == null || rowsXml.Count() == 0 || columns <= 0)
        //        return null;
        //    PdfPTable table = new PdfPTable(columns);
        //    foreach (var rowXml in rowsXml)
        //    {
        //        string cellText = CreateTextByPms(rowXml.Value, rowXml, pms);
        //        int Colspan = TypeHelper.StrToInt(XmlHelper.GetAttribeVal(rowXml, "colspan"), 1);
        //        float minHeight = TypeHelper.StrToFloat(XmlHelper.GetAttribeVal(rowXml, "minheight"), 20f);
        //        float width = TypeHelper.StrToFloat(XmlHelper.GetAttribeVal(rowXml, "width"), 0f);
        //        PdfPCell cell = new PdfPCell(new iTextSharp.text.Phrase(cellText, CreateFont(rowXml, data)));
        //        cell.Colspan = Colspan <= 0 ? 1 : Colspan; //cell.VerticalAlignment
        //        if (!string.IsNullOrWhiteSpace(XmlHelper.GetAttribeVal(rowXml, "bgcolor")))
        //            cell.BackgroundColor = GetPDFColor(XmlHelper.GetAttribeVal(rowXml, "bgcolor", "WHITE"));
        //        cell.HorizontalAlignment = TypeHelper.StrToInt(XmlHelper.GetAttribeVal(rowXml, "alignment"), 1); //0=Left, 1=Centre, 2=Right 
        //        if (minHeight > 0)
        //            cell.MinimumHeight = minHeight;
        //        if (width > 0)
        //            cell.Width = width; 
        //        table.AddCell(cell);
        //    }
        //    if (WidthPercentage > 0)
        //        table.WidthPercentage = WidthPercentage;//设置表格占的宽度，百分比 
        //    table.TotalWidth = 50f;//设置表格占的宽度，单位点数 
        //    table.SetTotalWidth(new float[]{200f}); 
        //    table.SetWidthPercentage(); 
        //    table.HorizontalAlignment = Element.ALIGN_LEFT; 
        //    Rectangle rect = new Rectangle(523, 770); 
        //    table.SetWidthPercentage(new float[] { 50, 25, 25 }, rect); 
        //    table.DefaultCell.BackgroundColor = (BaseColor.LIGHT_GRAY); //(null)

        //    table.SpacingBefore = 5;
        //    table.SpacingAfter = 5;
        //    doc.Add(table);
        //    return table;
        //}

        //public static AjaxMsgResult CreatePDF(string outPath, PDFdata data, bool isNew)
        //{
        //    string tmpPath, string outPath, Dictionary<string, string> parameters,bool isNew
        //    var res = new AjaxMsgResult();
        //    if (data == null || string.IsNullOrWhiteSpace(data.xmlPath) || !File.Exists(data.xmlPath))
        //    {
        //        res.Msg = "PDF模板文件无效";
        //        return res;
        //    }
        //    if (string.IsNullOrWhiteSpace(outPath))
        //    {
        //        res.Msg = "PDF生成文件无效";
        //        return res;
        //    }
        //    var isCreated = File.Exists(outPath);
        //    每次新建
        //    if (isNew)
        //    {
        //        已经存在，删除后再创建
        //        if (isCreated)
        //            File.Delete(outPath);
        //    }
        //    else
        //    {
        //        已经存在，不创建
        //        if (isCreated)
        //        {
        //            res.Success = true;
        //            res.Msg = "生成PDF:" + outPath + ",成功";
        //            return res;
        //        }
        //    }
        //    var newDir = Path.GetDirectoryName(outPath);
        //    if (!Directory.Exists(newDir))
        //        Directory.CreateDirectory(newDir);

        //    var doc = new Document(new Rectangle(100f, 300f));
        //    var doc1 = new Document(PageSize.A4);
        //    try
        //    {
        //        var docXml = XDocument.Load(data.xmlPath);
        //        if (docXml == null || docXml.Root == null || docXml.Root.Element("contents") == null || docXml.Root.Element("contents").Elements("content").Count() == 0)
        //        {
        //            res.Success = false;
        //            res.Msg = "PDF模板XML文件格式错误,缺少contents,contents节点";
        //            return res;
        //        }
        //        if (docXml.Root.Element("set") == null)
        //        {
        //            res.Success = false;
        //            res.Msg = "PDF模板XML文件格式错误,缺少set节点";
        //            return res;
        //        }

        //        var writer = PdfWriter.GetInstance(doc1, new FileStream(outPath, FileMode.Create));
        //        1.6版本
        //        writer.PdfVersion = PdfWriter.VERSION_1_6;
        //        没有密码，但只能打开和打印
        //        writer.SetEncryption(null, null, PdfWriter.AllowCopy | PdfWriter.AllowPrinting, true);
        //        设置阅读器的参数。单列显示，不显示大纲和缩略图
        //        writer.ViewerPreferences = PdfWriter.FitWindow
        //                            | PdfWriter.PageLayoutOneColumn
        //                            | PdfWriter.PageModeUseNone;

        //        doc1.Open();

        //        pdf设置
        //        var setXml = docXml.Root.Element("set");
        //        pdf设置--字体
        //        var set_fontsXml = setXml.Element("fonts");
        //        if (set_fontsXml != null)
        //        {
        //            var set_fontXmls = set_fontsXml.Elements("font");
        //            foreach (var set_fontXml in set_fontXmls)
        //            {
        //                string fontName = XmlHelper.GetAttribeVal(set_fontXml, "name", "");
        //                if (!string.IsNullOrWhiteSpace(fontName))
        //                {
        //                    string fontpath = XmlHelper.GetAttribeVal(set_fontXml, "path", "");
        //                    if (!File.Exists(fontpath))
        //                    { 
        //                        res.Msg = "PDF字体" + fontName + "路径无效";
        //                        return res;
        //                    }
        //                    if (!string.IsNullOrWhiteSpace(fontpath))
        //                    {
        //                        if (data.fontPath == null)
        //                            data.fontPath = new Dictionary<string, string>();
        //                        if (data.fontPath.ContainsKey(fontName))
        //                            data.fontPath[fontName] = fontpath;
        //                        else
        //                            data.fontPath.Add(fontName, fontpath);
        //                    }
        //                }
        //            }
        //        }
        //        if (data.fontPath == null || data.fontPath.Count == 0 || !data.fontPath.ContainsKey(Default_Font) || string.IsNullOrWhiteSpace(data.fontPath[Default_Font]))
        //        {
        //            res.Msg = "PDF字体设置无效或没有设置默认字体[" + Default_Font + "]";
        //            return res;
        //        }
        //        pdf设置--水印
        //        var set_wartermarkXml = setXml.Element("wartermark");
        //        if (set_wartermarkXml != null)
        //        {
        //            string wartermark = XmlHelper.GetAttribeVal(set_wartermarkXml, "path", "");
        //            if (!string.IsNullOrWhiteSpace(wartermark))
        //            {
        //                data.WaterMarkImgPath = wartermark;
        //            }
        //        }

        //        分页控件
        //        var page_bf = BaseFont.CreateFont(data.fontPath[Default_Font], BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
        //        var pageEvent = new PDFHeaderAndFooterEvent(page_bf, 10, data.WaterMarkImgPath);
        //        writer.PageEvent = pageEvent;

        //        开始根据XML创建PDF              
        //        var contentsXml = docXml.Root.Element("contents").Elements("content");//.OrderBy(m => m.Attribute("index").Value);
        //        foreach (var xnode in contentsXml)
        //        {
        //            CreateContent(writer, doc1, xnode, data);
        //        }

        //        writer.Flush();
        //        writer.CloseStream = true;
        //        res.Msg = "生成PDF:" + outPath + ",成功";
        //        res.Success = true;
        //    }
        //    catch (Exception ex)
        //    {
        //        GC.Collect();
        //        res.Msg = "生成PDF:" + outPath + ",失败";
        //        res.Success = false;
        //        Logging4net.WriteError(ex, "生成PDF:" + outPath + ",失败");
        //    }
        //    finally
        //    {
        //        if (doc1.IsOpen())
        //            doc1.Close();
        //    }
        //    return res;
        //}

    }
}
